package com.cloudlead.common.persistence;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.cloudlead.common.lang.persistence.IdEntity;

/**
 * 提供增删改查的仓储服务的接口
 * 
 * @author dean.lu
 * 
 * @param <Pojo>
 *            实体类
 * @param <ID>
 *            主键类
 */
public interface CrudRepository<Pojo extends IdEntity<ID>, ID extends Serializable>
		extends MutiTableQueryDslRepository<Pojo, ID> {

	/**
	 * 插入实体
	 * 
	 * @param entity
	 *            实体
	 */
	void save(Pojo entity);

	/**
	 * 批量插入实体
	 * 
	 * @param entities
	 *            实体集合
	 */
	void save(Collection<Pojo> entities);

	/**
	 * 更新实体，默认会将空值也一起更新
	 * 
	 * @param entity
	 *            实体
	 */
	void update(Pojo entity);

	/**
	 * 更新实体，不更新空值字段
	 * 
	 * @param entity
	 *            实体
	 */
	void updateWithNotNull(Pojo entity);

	/**
	 * 批量更新实体，默认会将空值也一起更新
	 * 
	 * @param entities
	 *            实体集合
	 */
	void update(Collection<Pojo> entities);

	/**
	 * 批量更新实体
	 * 
	 * @param entities
	 *            实体集合
	 * @param withNullBindings
	 *            是否更新空值字段
	 */
	void update(Collection<Pojo> entities, boolean withNullBindings);

	/**
	 * 合并更新实体，默认会将空值也一起更新
	 * 
	 * @param entity
	 *            实体
	 */
	void merge(Pojo entity);

	/**
	 * 批量合并更新实体，默认会将空值也一起更新
	 * 
	 * @param entities
	 *            实体集合
	 */
	void merge(Collection<Pojo> entities);

	/**
	 * 批量合并更新实体，新集合中没有出现的实体会被删除。默认会将空值也一起更新
	 * 
	 * @param newEntities
	 *            待更新的实体集合
	 * @param oldEntities
	 *            更新前的实体集合
	 */
	void merge(Collection<Pojo> newEntities, Collection<Pojo> oldEntities);

	/**
	 * 主键查询
	 * 
	 * @param id
	 *            主键
	 * @return 实体
	 */
	Pojo findById(ID id);

	/**
	 * 主键存在查询
	 * 
	 * @param id
	 *            主键
	 * @return 是否存在
	 */
	boolean exists(ID id);

	/**
	 * 全记录查询
	 * 
	 * @return 实体集合
	 */
	List<Pojo> findAll();

	/**
	 * 指定主键列表的查询
	 * 
	 * @param ids
	 *            主键列表
	 * @return 实体集合
	 */
	List<Pojo> findByIds(Collection<ID> ids);

	/**
	 * 统计记录数
	 * 
	 * @return 记录数
	 */
	long count();

	/**
	 * 根据主键删除
	 * 
	 * @param id
	 *            主键
	 */
	void deleteById(ID id);

	/**
	 * 根据主键列表删除
	 * 
	 * @param ids
	 */
	void deleteByIds(Collection<ID> ids);

	/**
	 * 删除实体
	 * 
	 * @param entity
	 *            实体
	 */
	void delete(Pojo entity);

	/**
	 * 批量删除
	 * 
	 * @param entities
	 *            实体集合
	 */
	void delete(Collection<? extends Pojo> entities);

}
